package com.ckzp.jfinal.weixin.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.IdcardUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.ckzp.core.ConfigUtil;
import com.ckzp.core.Results;
import com.ckzp.core.json.Jmode;
import com.ckzp.jfinal.weixin.model.WxFormColumn;
import com.jfinal.log.Log;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;

import java.util.List;

/**
 * Created by 51594 on 2023/8/1.
 */
public class WxFormUtil {


    public static Log log = Log.getLog(WxFormUtil.class);


    public static WxFormUtil n() {
        return new WxFormUtil();
    }

    /**
     * @param cid
     * @return
     */
    public Results getFormData(int user_id, int cid, Object key) {
        Results results = Results.n(9);
        if (cid == 0) return results.setMsg("列ID不能为零");
        if (user_id == 0) return results.setMsg("您未登陆");
        if (key == null) return results.setMsg("主键值不能为空");
        WxFormColumn col = WxFormColumn.dao.findById(cid);
        if (col == null) return results.setMsg("记录不存在");
        String data_table = col.getStr("data_table");//表名
        String data_column = col.getStr("data_column");//列名
        String data_key = col.getStr("data_key");//主键ID
        int check_userid = col.getInt("check_userid");//是否验证本人


        try {
            Record record = Db.findFirst("select * from " + data_table + " where " + data_key + "=?", key);
            if (record == null) return results.setMsg("数据不存在");
            ////////////////////
            if (check_userid == 1) {
                String check_column = col.getStr("check_column");//本人列名
                if (StrUtil.isBlank(check_column)) check_column = "user_id";//默认是user_id
                if (record.getInt(check_column) != user_id) return results.setMsg("只能修改自己的数据");
            }
            //////////////////////////////
            Object value = record.getObject(data_column);
            results.setCode(0).setData(Jmode.n()
                            .set("user_id", user_id)
                            .set("title", col.getStr("c_title"))
                            .set("tips", col.getStr("c_tips"))
                            .set("min", col.getInt("data_min"))
                            .set("max", col.getInt("data_max"))
                            .set("textvalue", value == null ? "" : value)
            );

        } catch (Exception e) {
            e.printStackTrace();
            return results.setMsg("表列配置不正确" + e.getMessage());
        }
        return results;
    }


    /**
     * @param cid
     * @return
     */
    public Results saveFormData(int user_id, int cid, Object key, Object value) {
        Results results = Results.n(9);
        if (cid == 0) return results.setMsg("列ID不能为零");
        if (user_id == 0) return results.setMsg("您未登陆");
        if (key == null) return results.setMsg("主键值不能为空");

        WxFormColumn col = WxFormColumn.dao.findById(cid);
        if (col == null) return results.setMsg("记录不存在");
        int fid = col.getInt("f_id");
        String data_table = col.getStr("data_table");
        String data_column = col.getStr("data_column");
        String data_key = col.getStr("data_key");
        int check_userid = col.getInt("check_userid");

        int is_log = col.getInt("is_log");
        ///////////////////判断禁用
        int is_forbidden = col.getInt("is_forbidden");
        if (is_forbidden == 1) return results.setMsg("该接口已禁用");
        //////////////////////////////////////////////////////////////////////
        results = checkFormValue(results, col, value);
        if (results.getCode() == 8) {
            return results;
        }
        value = results.getObject();//value值进行了验证和转换

        //////////////////////////////////////////////////////////////////////////////////////////
        try {
            //////////////////////////////////////////////////////////////////////////////////////////////////
            StrBuilder sql = StrBuilder.create().append("select * from " + data_table + " where ");
            StrBuilder up_sql = StrBuilder.create().append("update " + data_table + " ");
            up_sql.append("set " + data_column + "=? where ");

            List data_keys = StrUtil.split(data_key, ",");
            List keys = StrUtil.split(String.valueOf(key), ",");
            for (int i = 0; i < data_keys.size(); i++) {
                if (i > 0) sql.append(" and ");
                if (i > 0) up_sql.append(" and ");
                if (ConfigUtil.DbType() == 2) {//pgsql特殊处理
                    sql.append(data_keys.get(i) + "::VARCHAR=?");
                    up_sql.append(data_keys.get(i) + "::VARCHAR=?");
                } else {
                    sql.append(data_keys.get(i) + "=?");
                    up_sql.append(data_keys.get(i) + "=?");
                }
            }
            Record record = Db.findFirst(sql.toString(), keys.toArray());
            if (record == null) return results.setMsg("数据不存在");
            ////////////////////
            if (check_userid == 1) {
                String check_column = col.getStr("check_column");
                if (StrUtil.isBlank(check_column)) check_column = "user_id";
                if (record.getInt(check_column) != user_id) return results.setMsg("只能修改自己的数据");
            }
            ///////////////////////////////////////////////////////////////////////////////////////////////////
//            System.out.println(value);
//            System.out.println(up_sql.toString());
//            System.out.println(JsonUtil.toJsonString(keys));
            List values = CollUtil.newArrayList(value);
            values.addAll(keys);
//            System.out.println(JsonUtil.toJsonString(values));
            int count = Db.update(up_sql.toString(), values.toArray());
            if (count == 0) return results.setMsg("未更改任何数据");
            ////////////////////特殊处理 新手奖励完善个人信息///////////////////////////////////

            ///////////////////////////////////////////////////////////////////////
            //////记录日志//////////////////////////////////////////////////////
            if (is_log == 1) {
                log.info("[SaveFormData][UID][" + user_id + "][CID][" + cid + "][KEY][" + key + "][VALUE][" + value + "]");
            }
            ////////////////////////
            results.setCode(0).setMsg("保存成功");
        } catch (Exception e) {
            log.error("[SaveFormData][UID][" + user_id + "][CID][" + cid + "][KEY][" + key + "][VALUE][" + value + "]");
            log.error("保存表失败", e);
            e.printStackTrace();
            return results.setMsg("表列配置不正确");
        }
        return results;
    }

    /**
     * 验证判断 传入的参数合法性
     *
     * @param results
     * @param col
     * @param value
     * @return
     */
    private Results checkFormValue(Results results, WxFormColumn col, Object value) {

        int data_type = col.getInt("data_type");//输入类型
        int check_null = col.getInt("check_null");//0可空1不可空
        String c_name = col.mod.getStr("c_name", "");
        int data_min = col.getInt("data_min");
        int data_max = col.getInt("data_max");

        /////////////////////////验证空///////////////////////////////////////////////////
        if (check_null == 1 && value == null) return results.setCode(8).setMsg(c_name + "不能为空");

        ///////////////////字符长度处理////////////////////////
        if (data_type == 0) {
            try {
                if (value != null) {
                    int length = String.valueOf(value).length();
                    if (length < data_min || length > data_max) {
                        return results.setCode(8).setMsg(StrUtil.format(c_name + "长度应介于{}和{}之间", data_min, data_max));
                    }
                }
            } catch (Exception e) {
                return results.setCode(8).setMsg("请输入正确的" + c_name);
            }
        }
        /////////数字处理////////////////////////////////////////////////////////
        if (data_type == 1) {
            try {
                if (value != null) {
                    int num_value = NumberUtil.parseInt(String.valueOf(value));
                    if (num_value < data_min) results.setCode(8).setMsg(c_name + "不能小于" + data_min);
                    if (num_value > data_max) results.setCode(8).setMsg(c_name + "不能大于" + data_max);
                    value = num_value;
                }
            } catch (Exception e) {
                return results.setCode(8).setMsg("请输入正确的" + c_name);
            }
        }
        /////////日期处理////////////////////////////////////////////////////////
        if (data_type == 2) {
            try {
                if (value != null) value = DateUtil.parse(String.valueOf(value));
            } catch (Exception e) {
                return results.setCode(8).setMsg("请输入正确的" + c_name);
            }
        }
        ///////////////////////3手机号验证//////////////////////////////
        if (data_type == 3) {
            if (!Validator.isMobile(String.valueOf(value))) return results.setCode(8).setMsg("请输入正确的" + c_name);
        }
        ///////////////////////////////////////////////
        if (data_type == 4) {
            if (!IdcardUtil.isValidCard(String.valueOf(value))) return results.setCode(8).setMsg("请输入有效的身份证号");
        }
        ///////////////////////////////////////////////////////////////
        return results.setObject(value);
    }
}
